Generation of a parity value in a RAID storage system is both processor intensive and bandwidth intensive. For example, a large RAID system may include a redundant pair of RAID adapters or controllers, multiple pairs of redundant disk array switches, an equal number of sets of hard disk drives (HDDs) and an equal number of sub-processors. The components are interconnected through a “fabric”: the adapters are interconnected with a first pair of switches, the first pair of switches are interconnected with a second pair, and so forth in a daisy chain fashion. Each sub-processor is coupled to a pair of switches and each set of HDDs is likewise coupled to a pair of switches. In order for an instruction to be transmitted from an adapter to a switch, it must be pass through any of the upstream fabric and switches. Similarly, data must be passed upstream through any switches to the adapter.
The conventional process of generating a parity value requires a substantial use of adapter resources and fabric bandwidth. The RAID adapter performs an exclusive-OR (XOR) on blocks of data across a group of HDDs to generate a parity block: Ap=A1+A2+ . . . +An, where Ap is the parity block and ‘+’ represents an XOR operation. For example, in a typical RAID level 5 array to generate the data block parity for a group that consists of six data-containing HDDs plus a parity HDD, the adapter must perform six read operations, generate the parity value, and one write operation to store the parity onto the seventh HDD. Additionally, when a write is to be made of data which does not span all of the drives in a group, either reads of the data blocks on the drives must be made or the prior data and prior parity are needed in order to generate the new parity block. All of these operations consume adapter resources and produce traffic across the fabric. Resource consumption is even greater when rebuilding a failed drive. Again, the adapter reads data blocks and the parity block from the other drives, applies the parity block to the data block and recreates the missing data blocks. While a fast rebuild time is important to return the storage system to the required level of redundancy, it comes at the cost of decreased system performance as the adapter is less able to perform other functions.
Consequently, a need remains for efficient parity generation and drive rebuild operations which require fewer adapter resources and less fabric bandwidth.